package com.framework.macros;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.InputEvent;
import org.zkoss.zk.ui.ext.AfterCompose;
import org.zkoss.zul.Label;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Vlayout;
import org.zkoss.zul.Window;


/**
 * Este macro componente te permite, mostrar un popup, al presionar sobre el campo de texto
 * para no ocupar tanto espacio.
 * @author Luis Miguel Hernandez Perez
 * */
public class CampoObservacionesPopupMacro extends Textbox implements AfterCompose{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
//	private static Logger log = Logger.getLogger(CampoObservacionesPopupMacro.class);
	private Popup popupObservaciones = null;
	
	private Window window;
	private Textbox textbox;
	
	private boolean readonly;
	
	private OnCambioTexto onCambioTexto;
	
	public CampoObservacionesPopupMacro(Window window) {
		this.window = window;
		afterCompose();
	}
	
	public CampoObservacionesPopupMacro(Component padre) {
		afterCompose();
	}
	
	public CampoObservacionesPopupMacro() {
		
	}
	
	@Override
	public void setDisabled(boolean disabled) {
		setReadonly(disabled); 
	}
	
	@Override
	public void setReadonly(boolean readonly) {
		this.readonly = readonly;
	}
	
	public void setReadonlySuper(boolean readonly){
		super.setReadonly(readonly); 
	}
 
	@Override
	public void afterCompose() {
			super.setReadonly(true);
			setStyle("cursor:pointer");  
			setTooltiptext("por favor, presionar para desplegar el campo..!!"); 
			addEventListener(Events.ON_CLICK, new EventListener<Event>() {
				@Override
				public void onEvent(Event event) throws Exception {
					//log.info("@onEvent cargando el evento."); 
					if(popupObservaciones == null)popupObservaciones = generarpopUp(); 	
	                popupObservaciones.open(CampoObservacionesPopupMacro.this, "after_end");
	                popupObservaciones.focus();
	                //log.info("@onEvent despues de cargar el evento.");
				}
			});
	}

	/**
	 * Este metodo se encarga de generar el popup
	 * @author Luis Miguel Hernandez
	 * */
	protected Popup generarpopUp() { 
		final Popup popup = new Popup();
		textbox = new Textbox(); 
		textbox.setReadonly(isReadOnly());
		popup.addEventListener(Events.ON_OPEN, new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {
				textbox.setValue(CampoObservacionesPopupMacro.this.getValue());
				textbox.setFocus(true);
			}
		});
		
		textbox.addEventListener(Events.ON_BLUR, new EventListener<Event>() {
			@Override
			public void onEvent(Event event) throws Exception {
				if(onCambioTexto != null){
					onCambioTexto.texto(textbox.getValue());
					//log.info("@generarpopUp Texto seleccionado: " + textbox.getValue());
				}
			}
		});
		
		/* Agregamos titulo de */
		Vlayout vlayout = new Vlayout();

		Label labelObservaciones = new Label("Observaciones");
		labelObservaciones.setStyle("font-weight:bold");

		vlayout.appendChild(labelObservaciones);
		
		/* Agregamos campos de textos */
		textbox.setWidth("350px");
		textbox.setRows(8);
		
		vlayout.appendChild(textbox);
		textbox.setValue(CampoObservacionesPopupMacro.this.getValue());
		textbox.addEventListener("onChanging", new EventListener<Event>() {
			@Override
			public void onEvent(Event event) throws Exception {
				InputEvent inputevent = (InputEvent) event;
				CampoObservacionesPopupMacro.this.setValue(inputevent.getValue());
			}
		});
		popup.appendChild(vlayout);
		popup.setPage(getPage());
		return popup;
	}
	
	@Override
	public void setText(String value) throws WrongValueException {
		super.setText(value);
		if(textbox != null){
			textbox.setValue(value);
		}
	}

	public Window getWindow() {
		return window;
	}

	public void setWindow(Window window) {
		this.window = window;
	}
	
	
	public OnCambioTexto getOnCambioTexto() {
		return onCambioTexto;
	}

	public void setOnCambioTexto(OnCambioTexto onCambioTexto) {
		this.onCambioTexto = onCambioTexto;
	}

    /**
     * Esta interface es el evento cuando el texto cambia
     * @author Luis Miguel
     * */
	public interface OnCambioTexto{
		void texto(String texto);
	}

	public boolean isReadOnly() {
		return readonly;
	}
}
